﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.Data;
using System.Data.SqlClient;

using QCM.Contract1;

namespace ServiceModel
{
    // REMARQUE : si vous modifiez le nom de classe « Service1 » ici, vous devez également mettre à jour la référence à « Service1 » dans App.config.

    [ServiceBehavior (InstanceContextMode = InstanceContextMode.Single)]
	public class Service1 :IContractContract
    {
   
        int nbAppel;
        public int NbAppel
        {
            get { return this.nbAppel; }
            set { this.nbAppel = value; }
        }

        static int nbInstance;
        public static int NbInstance
        {
            get { return nbInstance; }
            set { nbInstance = value; }
        }

        SqlCommand cmd;
        SqlConnection cnx;

        public Service1()
        {
            NbAppel = 0;
            NbInstance++;
//            GC.Collect();

            cnx = new SqlConnection(ServiceModel.Properties.Settings.Default.ConnectDataBase);

            cmd = new SqlCommand();
            cmd.CommandText = "GetCategories";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = cnx;
        }

        #region ICategorie Membres

        public List<Categorie> GetCategories()
        {
            NbAppel++;
            List<Categorie> categories = new List<Categorie>();
            try
            {
                cmd.Connection.Open();
                using (SqlDataReader sdr = cmd.ExecuteReader())
                {
                    while (sdr.Read())
                    {
                        categories.Add(new Categorie((string)sdr["Nom"], 
                            sdr["Mere"].GetType() == Type.GetType("System.DBNull")? String.Empty: (string)sdr["Mere"]));
                    }
                }
            }
            catch(Exception e)
            {
                //throw new FaultException(e.Message, new FaultCode("PbDataBase"));
                SQLFaultException sfe = new SQLFaultException();
                sfe.code = "PbDataBase";
                sfe.message = e.Message;
                sfe.reason = "Impossible de ce connecter à la base de données";
                throw new FaultException<SQLFaultException>(sfe);
            }
            finally
            {
                if (cmd.Connection.State == ConnectionState.Open)
                    cmd.Connection.Close();
            }

            return categories;
        }

        #endregion

        #region IQuestionnaire Membres

        SqlCommand cmdGetQuestionnaire = null;
        public Questionnaire GetQuestionnaire(string name)
        {
            NbAppel++;
            Questionnaire questionnaire = null;
            //Je recupere les informations globales du questionnaire
            if (cmdGetQuestionnaire == null)
            {
                cmdGetQuestionnaire = new SqlCommand();
                cmdGetQuestionnaire.CommandText = "GetQuestionnaire";
                cmdGetQuestionnaire.CommandType = CommandType.StoredProcedure;
                cmdGetQuestionnaire.Connection = cnx;
                cmdGetQuestionnaire.Parameters.Add(new SqlParameter("@NomQuestionnaire", SqlDbType.VarChar, 50));
            }
            try
            {
                cmdGetQuestionnaire.Parameters["@NomQuestionnaire"].Value = name;
                cmdGetQuestionnaire.Connection.Open();
                using (SqlDataReader sdr = cmdGetQuestionnaire.ExecuteReader())
                {
                    sdr.Read();
                    questionnaire = new Questionnaire((string)sdr["Nom"], (string)sdr["Descriptif"]);
                }
            }
            catch
            {
                // TODO: implementation a faire lors de la mise en place de WCF
                throw new Exception("Echec dans l'execution de GetQuestionnaire");
            }
            finally
            {
                if (cmdGetQuestionnaire.Connection.State == ConnectionState.Open)
                    cmdGetQuestionnaire.Connection.Close();
            }

            
            //J'appel GetQuestions et j'insert les resultats dans l'objet Questionnaire
            questionnaire.Questions = GetQuestions(name);
            return questionnaire;
        }

        SqlCommand cmdTitre = null;
        public List<String> GetQuestionnaires(string categorie)
        {
            // A IMPLEMENTER CORRECTEMENT
            //List<QCM.Contract1.ShortQuestionnaire> questionnaires = new List() ;
            //cmd.CommandText = "SELECT q.Id as id, q.Nom as titre from Questionnaires q where q.IdCat = @idCategorie" ;
            //cmd.Parameters.Add("@idCategorie", SqlDbType.Int);
            //cmd.Parameters["@idCategorie"].Value = idCategorie ;
            //cmd.Connexion = cnx ;

            NbAppel++;
            List<String> titresQuestionnaires = new List<String>();
            if (cmdTitre == null)
            {
                cmdTitre = new SqlCommand();
                cmdTitre.CommandText = "GetQuestionnaires";
                cmdTitre.CommandType = CommandType.StoredProcedure;
                cmdTitre.Connection = cnx;
                cmdTitre.Parameters.Add(new SqlParameter("@NomCategorie", SqlDbType.VarChar, 50));
            }


            try
            {
                cmdTitre.Parameters["@NomCategorie"].Value = categorie;
                cmdTitre.Connection.Open();
                using (SqlDataReader sdr = cmdTitre.ExecuteReader())
                {
                    while (sdr.Read())
                    {
                        titresQuestionnaires.Add((string)sdr["Nom"]);
                    }
                }
            }
            catch
            {
                // TODO: implementation a faire lors de la mise en place de WCF
                throw new Exception("Echec dans l'execution de GetQuestionnaires");
            }
            finally
            {
                if (cmdTitre.Connection.State == ConnectionState.Open)
                    cmdTitre.Connection.Close();
            }
            return titresQuestionnaires;
        }

        #endregion

        #region IReponse Membres

        public List<Reponse> GetReponses(int idQuestion)
        {
            throw new NotImplementedException();
        }

        #endregion

        #region IQuestion Membres
        SqlCommand cmdGetIdQuestion = null;
        SqlCommand cmdGetQuestionAndReponses = null;

        /// <summary>
        /// Retourne l'ensemble des questions et les reponses associées
        /// </summary>
        /// <param name="nomQuestionnaire">Nom du questionnaire dans lequel recuperer les questions</param>
        /// <returns></returns>
        public List<Question> GetQuestions(string nomQuestionnaire)
        {
            List<Question> res = new List<Question>();
            if (cmdGetIdQuestion == null)
            {
                cmdGetIdQuestion = new SqlCommand();
                cmdGetIdQuestion.CommandText = "GetIdQuestions";
                cmdGetIdQuestion.CommandType = CommandType.StoredProcedure;
                cmdGetIdQuestion.Connection = cnx;
                cmdGetIdQuestion.Parameters.Add(new SqlParameter("@NomQuestionnaire", SqlDbType.VarChar, 50));
            }
            if (cmdGetQuestionAndReponses == null)
            {
                cmdGetQuestionAndReponses = new SqlCommand();
                cmdGetQuestionAndReponses.CommandText = "GetQuestionAndReponses";
                cmdGetQuestionAndReponses.CommandType = CommandType.StoredProcedure;
                cmdGetQuestionAndReponses.Connection = cnx;
                cmdGetQuestionAndReponses.Parameters.Add(new SqlParameter("@IdQuestion", SqlDbType.Int));
            }

            
            //Je recup les id des questions associées au questionnaire
            try
            {
                cmdGetIdQuestion.Parameters["@NomQuestionnaire"].Value = nomQuestionnaire;
                cmdGetIdQuestion.Connection.Open();
                using (SqlDataReader sdr = cmdGetIdQuestion.ExecuteReader())
                {
                    //Pour chaque Id je crée un objet Question avec ses reponses
                    while (sdr.Read())
                    {
                        cmdGetQuestionAndReponses.Parameters["@IdQuestion"].Value = (int)sdr[0];
                        cmdGetQuestionAndReponses.Connection.Open();
                        using (SqlDataReader sdr2 = cmdGetQuestionAndReponses.ExecuteReader())
                        {
                            while (sdr2.Read())
                            {
                                Question quest = new Question((string)sdr2["Titre"], (int)sdr2["Id"]);                            
                            }
                        }

                    }
                }
            }
            catch
            {
                // TODO: implement(ation a faire lors de la mise en place de WCF
//                throw new Exception("Echec dans l'execution de GetIdQuestions");
            }
            finally
            {
                if (cmdGetIdQuestion.Connection.State == ConnectionState.Open)
                    cmdGetIdQuestion.Connection.Close();
            }

            return res;
        }

        #endregion
    }
}
